Spring MVC তে Exception Handling একটি গুরুত্বপূর্ণ ফিচার, যা আপনাকে অ্যাপ্লিকেশন চলাকালীন 발생 করা ত্রুটিগুলো সঠিকভাবে হ্যান্ডল করতে সাহায্য করে। Spring MVC তে ত্রুটির হ্যান্ডলিং এবং কাস্টম ত্রুটি বার্তা প্রদানের জন্য @ControllerAdvice এবং @ExceptionHandler এনোটেশন ব্যবহার করা হয়।
এখানে আমরা দেখব কিভাবে Spring MVC তে Exception Handling করা যায় এবং কিভাবে @ControllerAdvice এবং @ExceptionHandler ব্যবহার করা যায়।
1. Spring MVC তে Exception Handling
Spring MVC তে রিকোয়েস্ট প্রক্রিয়া চলাকালীন যে কোন ত্রুটি বা এক্সসেপশন ঘটলে তা কন্ট্রোলার থেকে সরাসরি হ্যান্ডলিং করা যেতে পারে, অথবা @ControllerAdvice ব্যবহার করে গ্লোবালি হ্যান্ডল করা যেতে পারে।
@ExceptionHandler এর মাধ্যমে Exception Handling
@ExceptionHandler এনোটেশন ব্যবহার করে আমরা কন্ট্রোলারে একটি নির্দিষ্ট এক্সসেপশন হ্যান্ডলারের ব্যবস্থা করতে পারি। এটি কেবলমাত্র সেই কন্ট্রোলারের মধ্যে প্রযোজ্য যেখানে এটি প্রয়োগ করা হয়েছে।
উদাহরণ: @ExceptionHandler ব্যবহার
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class MyController {
@GetMapping("/test")
public String testMethod() {
// Some business logic that may throw an exception
if (true) {
throw new IllegalArgumentException("Custom error message");
}
return "testPage";
}
@ExceptionHandler(IllegalArgumentException.class)
public String handleIllegalArgumentException(IllegalArgumentException ex) {
// Handling the exception and providing custom message
return "errorPage"; // Return the name of the error view
}
}
এখানে:
@ExceptionHandler(IllegalArgumentException.class): এটিIllegalArgumentExceptionএর জন্য ত্রুটি হ্যান্ডলিং করে। যখন এটি ঘটবে, তখনhandleIllegalArgumentException()মেথডটি কল হবে এবং একটি কাস্টম ভিউ রিটার্ন হবে (যেমনerrorPageএর নাম দেওয়া হয়েছে)।
2. @ControllerAdvice এর মাধ্যমে গ্লোবাল Exception Handling
@ControllerAdvice Spring MVC তে একটি গ্লোবাল এক্সসেপশন হ্যান্ডলার হিসেবে কাজ করে, যা সমস্ত কন্ট্রোলারের জন্য এক্সসেপশন হ্যান্ডল করতে সাহায্য করে। এটি একটি অ্যাপ্লিকেশন লেভেল এক্সসেপশন হ্যান্ডলিং প্রদান করে, যেখানে একাধিক কন্ট্রোলারের ত্রুটিগুলি একত্রে হ্যান্ডল করা যায়।
@ControllerAdvice কনফিগারেশন উদাহরণ
import org.springframework.http.HttpStatus;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(IllegalArgumentException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST) // Set the HTTP Status Code
public String handleIllegalArgumentException(IllegalArgumentException ex, Model model) {
model.addAttribute("error", ex.getMessage()); // Pass error message to view
return "errorPage"; // Return the name of the error view
}
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public String handleGeneralException(Exception ex, Model model) {
model.addAttribute("error", "An unexpected error occurred: " + ex.getMessage());
return "errorPage";
}
}
এখানে:
@ControllerAdvice: এটি একটি গ্লোবাল এক্সসেপশন হ্যান্ডলার তৈরি করে, যা সমস্ত কন্ট্রোলারের জন্য প্রযোজ্য।@ExceptionHandler(IllegalArgumentException.class): এটিIllegalArgumentExceptionধরণের ত্রুটি হ্যান্ডল করে।@ResponseStatus(HttpStatus.BAD_REQUEST): এই এনোটেশনটি HTTP স্ট্যাটাস কোড নির্ধারণ করে। এখানে400 Bad Requestরিটার্ন করা হচ্ছে।
handleGeneralException() মেথডটি সব ধরনের Exception এর জন্য কাজ করবে, এবং একটি সাধারণ ত্রুটি বার্তা প্রদান করবে।
3. @ResponseStatus ব্যবহার করা
@ResponseStatus এনোটেশন ব্যবহার করে আপনি কাস্টম HTTP স্ট্যাটাস কোড সেট করতে পারেন যখন কোনো এক্সসেপশন ঘটে। এটি HTTP রেসপন্সে স্ট্যাটাস কোড সেট করার জন্য ব্যবহৃত হয়।
উদাহরণ: @ResponseStatus ব্যবহার
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;
@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "Resource Not Found")
public class ResourceNotFoundException extends RuntimeException {
public ResourceNotFoundException(String message) {
super(message);
}
}
এখানে:
@ResponseStatus(value = HttpStatus.NOT_FOUND): এটি404 Not FoundHTTP স্ট্যাটাস কোড রিটার্ন করবে যখনResourceNotFoundExceptionঘটবে।
4. Custom Error Handling with @ControllerAdvice
কাস্টম ত্রুটি বার্তা এবং ভিউ তৈরির জন্য আপনি @ModelAttribute বা @RequestMapping ব্যবহার করতে পারেন, যাতে ভিউতে বিশেষ ত্রুটি বার্তা বা ডেটা প্রেরণ করা যায়।
কাস্টম ত্রুটি বার্তা সহ গ্লোবাল হ্যান্ডলার
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public String handleAllExceptions(Exception ex, Model model) {
model.addAttribute("errorMessage", "Something went wrong! " + ex.getMessage());
return "error"; // Return the name of the error view
}
}
এখানে, errorMessage মডেল অ্যাট্রিবিউট হিসাবে ব্যবহারকারীকে কাস্টম ত্রুটি বার্তা প্রদানের জন্য model.addAttribute() ব্যবহার করা হয়েছে। error ভিউ রিটার্ন করা হচ্ছে, যা ত্রুটি বার্তা ইউজারের কাছে উপস্থাপন করবে।
5. JSON Response with @RestControllerAdvice
@RestControllerAdvice একটি বিশেষ ধরনের @ControllerAdvice যা শুধু RESTful ওয়েব সার্ভিসের জন্য কাজ করে এবং JSON বা XML রেসপন্স প্রদান করতে ব্যবহৃত হয়।
উদাহরণ: @RestControllerAdvice
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.bind.annotation.ResponseStatus;
@RestControllerAdvice
public class RestExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public String handleResourceNotFoundException(ResourceNotFoundException ex) {
return "{\"error\":\"" + ex.getMessage() + "\"}";
}
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public String handleGeneralException(Exception ex) {
return "{\"error\":\"An unexpected error occurred: " + ex.getMessage() + "\"}";
}
}
এখানে:
@RestControllerAdvice: এটি RESTful সেবার জন্য এক্সসেপশন হ্যান্ডলিং করে এবং JSON রেসপন্স রিটার্ন করে।
Summary
- @ExceptionHandler: একটি নির্দিষ্ট কন্ট্রোলারের মধ্যে এক্সসেপশন হ্যান্ডলিং করার জন্য ব্যবহার করা হয়।
- @ControllerAdvice: এটি গ্লোবাল এক্সসেপশন হ্যান্ডলিং প্রোভাইড করে এবং সমস্ত কন্ট্রোলারে প্রযোজ্য।
- @ResponseStatus: HTTP স্ট্যাটাস কোড নির্ধারণ করার জন্য ব্যবহৃত হয়।
- @RestControllerAdvice: RESTful API এর জন্য JSON রেসপন্স সহ এক্সসেপশন হ্যান্ডলিং প্রোভাইড করে।
Spring MVC তে Exception Handling এর মাধ্যমে আপনি সহজেই অ্যাপ্লিকেশনের ত্রুটিগুলি পরিচালনা করতে পারবেন এবং ইউজারকে একটি পরিষ্কার ত্রুটি বার্তা প্রদান করতে সক্ষম হবেন। @ControllerAdvice এবং @ExceptionHandler এর ব্যবহার আপনার কোডকে আরও ক্লিন, রক্ষণাবেক্ষণযোগ্য এবং গ্লোবালি সুরক্ষিত রাখবে।
Spring MVC অ্যাপ্লিকেশনগুলিতে Exception Handling একটি গুরুত্বপূর্ণ দিক, যেহেতু ব্যবহারকারী বা সিস্টেমের বিভিন্ন ত্রুটি (errors) সঠিকভাবে পরিচালনা করা প্রয়োজন। Spring MVC-তে Exception Handling পরিচালনা করার জন্য বেশ কিছু সুবিধাজনক পদ্ধতি রয়েছে, যা অ্যাপ্লিকেশনকে আরো স্থিতিশীল এবং ব্যবহারকারীর জন্য উপকারী করে তোলে।
Spring MVC এর Exception Handling দুটি প্রধানভাবে পরিচালনা করা হয়:
- Controller-level exception handling
- Global exception handling
1. Controller-level Exception Handling
Spring MVC তে প্রতিটি কন্ট্রোলার মেথডে এককভাবে exception হ্যান্ডলিং করা যেতে পারে। এর জন্য @ExceptionHandler অ্যানোটেশন ব্যবহৃত হয়, যা কন্ট্রোলার ক্লাসের মধ্যে সুনির্দিষ্ট একটি exception পরিচালনা করতে সাহায্য করে।
@ExceptionHandler Example:
import org.springframework.http.HttpStatus;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ResponseStatus;
@Controller
public class MyController {
@GetMapping("/divide")
public String divideNumbers(int num1, int num2) {
int result = num1 / num2; // Possible divide by zero exception
return "result";
}
@ExceptionHandler(ArithmeticException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST) // Set HTTP status code 400
public String handleArithmeticException(ArithmeticException ex, Model model) {
model.addAttribute("error", "Error: " + ex.getMessage());
return "errorPage"; // Show custom error page
}
}
ব্যাখ্যা:
@ExceptionHandler: এই অ্যানোটেশনটি সুনির্দিষ্ট exception ধরণের জন্য exception handler মেথড নির্ধারণ করে।- ArithmeticException: এখানে আমরা ArithmeticException (যেমন, division by zero) হ্যান্ডল করতে একটি মেথড তৈরি করেছি।
@ResponseStatus: এই অ্যানোটেশনটি HTTP রেসপন্স কোড নির্ধারণ করতে ব্যবহৃত হয়। এখানে আমরা BAD_REQUEST (400) কোড ব্যবহার করেছি।
2. Global Exception Handling
Spring MVC-তে Global Exception Handling করতে @ControllerAdvice অ্যানোটেশন ব্যবহৃত হয়। এটি সারা অ্যাপ্লিকেশন জুড়ে exception হ্যান্ডলিং করার একটি কেন্দ্রীয় স্থান প্রদান করে।
@ControllerAdvice Example:
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ArithmeticException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public String handleArithmeticException(ArithmeticException ex, Model model) {
model.addAttribute("error", "Global Error: " + ex.getMessage());
return "errorPage";
}
@ExceptionHandler(NullPointerException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public String handleNullPointerException(NullPointerException ex, Model model) {
model.addAttribute("error", "Global Error: Null pointer exception");
return "errorPage";
}
}
ব্যাখ্যা:
@ControllerAdvice: এটি কন্ট্রোলারগুলির বাইরে একটি কেন্দ্রীয় পদ্ধতি যা সমস্ত @ExceptionHandler অ্যানোটেশন যুক্ত মেথড সারা অ্যাপ্লিকেশনের জন্য কার্যকর করে।- Global Exception Handling: এই কোডে, আমরা সমস্ত কন্ট্রোলারদের জন্য ArithmeticException এবং NullPointerException হ্যান্ডল করেছি।
3. Using ResponseEntity for Custom Response
Spring MVC-তে ResponseEntity ব্যবহার করে আপনি কাস্টম HTTP রেসপন্স এবং ত্রুটি তথ্যও ফেরত দিতে পারেন।
Example with ResponseEntity:
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ControllerAdvice;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ArithmeticException.class)
public ResponseEntity<String> handleArithmeticException(ArithmeticException ex) {
return new ResponseEntity<>("Error: " + ex.getMessage(), HttpStatus.BAD_REQUEST);
}
@ExceptionHandler(NullPointerException.class)
public ResponseEntity<String> handleNullPointerException(NullPointerException ex) {
return new ResponseEntity<>("Error: Null pointer exception occurred", HttpStatus.INTERNAL_SERVER_ERROR);
}
}
ব্যাখ্যা:
- ResponseEntity: এখানে, আমরা কাস্টম HTTP status এবং message ফেরত দিচ্ছি, যা ক্লায়েন্টকে ত্রুটির বিস্তারিত তথ্য প্রদান করবে।
- HttpStatus:
HttpStatus.BAD_REQUESTবাHttpStatus.INTERNAL_SERVER_ERRORরিটার্ন করা হচ্ছে।
4. Using @ResponseStatus for Automatic HTTP Status Codes
Spring MVC-তে @ResponseStatus অ্যানোটেশন ব্যবহার করে, আমরা স্বয়ংক্রিয়ভাবে exception হ্যান্ডলিংয়ের সময় HTTP status code সেট করতে পারি।
Example with @ResponseStatus:
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;
@ResponseStatus(HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {
public ResourceNotFoundException(String message) {
super(message);
}
}
ব্যাখ্যা:
- @ResponseStatus: এখানে আমরা ResourceNotFoundException exception ক্লাসে HttpStatus.NOT_FOUND (404) ব্যবহার করেছি, যাতে এই exception ঘটলে 404 Not Found HTTP রেসপন্স ফেরত পাঠানো হয়।
5. Custom Error Page Configuration
Spring MVC-তে custom error page কনফিগার করতে, আপনি web.xml বা Java configuration এ error mapping করতে পারেন।
web.xml Example:
<error-page>
<exception-type>java.lang.ArithmeticException</exception-type>
<location>/errorPage.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/404Error.jsp</location>
</error-page>
ব্যাখ্যা:
- এখানে, আমরা একটি ArithmeticException এবং 404 error এর জন্য কাস্টম error page সঠিকভাবে মেলাতে error-page কনফিগার করেছি।
Best Practices for Exception Handling in Spring MVC
- Use @ControllerAdvice for Global Exception Handling:
- @ControllerAdvice ব্যবহার করে, আপনি অ্যাপ্লিকেশনের সারা অংশে exception হ্যান্ডলিং করতে পারেন, যা কোডের পুনরাবৃত্তি কমিয়ে দেয় এবং পরিষ্কার করে।
- Return Meaningful Error Messages:
- রেসপন্সে একটি বোধগম্য ত্রুটি বার্তা (error message) পাঠান, যাতে ব্যবহারকারী সমস্যাটি দ্রুত সমাধান করতে পারে।
- Handle Specific Exceptions:
- বিভিন্ন ধরনের exception এর জন্য পৃথক handler তৈরি করুন, যাতে সঠিকভাবে নির্দিষ্ট ত্রুটির জন্য উপযুক্ত রেসপন্স প্রদান করা যায়।
- Use ResponseEntity for Flexibility:
- ResponseEntity ব্যবহার করে, আপনি কাস্টম HTTP status এবং error message সহ রেসপন্স পাঠাতে পারেন।
- Log Exceptions:
- সিস্টেমে হওয়া exception গুলোর লগ তৈরি করুন যাতে সমস্যা ট্র্যাক করা এবং ডিবাগ করা সহজ হয়।
Conclusion
Spring MVC তে Exception Handling অত্যন্ত গুরুত্বপূর্ণ, কারণ এটি ব্যবহারকারীর জন্য একটি সুরক্ষিত এবং বোধগম্য অভিজ্ঞতা নিশ্চিত করে। কন্ট্রোলার লেভেল এবং গ্লোবাল লেভেলে exception হ্যান্ডলিংয়ের জন্য Spring MVC অনেক নমনীয়তা প্রদান করে, যা ডেভেলপারদের সহজেই ত্রুটিগুলি পরিচালনা এবং যথাযথ রেসপন্স প্রদান করতে সক্ষম করে। @ExceptionHandler, @ControllerAdvice, ResponseEntity, এবং @ResponseStatus এর মাধ্যমে আমরা Spring MVC তে exception গুলি কার্যকরভাবে হ্যান্ডল করতে পারি।
Spring MVC তে @ExceptionHandler অ্যানোটেশন ব্যবহার করে আপনি কাস্টম এক্সসেপশন তৈরি এবং তা হ্যান্ডল করতে পারেন। এটি আপনার অ্যাপ্লিকেশনে Exception Handling সহজ এবং সেন্ট্রালাইজড করতে সাহায্য করে, যাতে ভিউ বা কন্ট্রোলার সঠিকভাবে ত্রুটির তথ্য পাঠাতে পারে এবং প্রয়োজনীয় ব্যবস্থা নিতে পারে।
@ExceptionHandler অ্যানোটেশন দিয়ে আপনি নির্দিষ্ট এক্সসেপশন ক্লাসের জন্য একটি মেথড তৈরি করতে পারেন যা ওই এক্সসেপশন হ্যান্ডল করবে। এটি কন্ট্রোলারের মধ্যে বা গ্লোবাল সেকশনে ব্যবহৃত হতে পারে।
1. কাস্টম এক্সসেপশন তৈরি করা:
প্রথমে আপনাকে একটি কাস্টম এক্সসেপশন ক্লাস তৈরি করতে হবে যা আপনার নির্দিষ্ট ত্রুটি বা সমস্যার জন্য ব্যবহার হবে।
কাস্টম এক্সসেপশন ক্লাস উদাহরণ:
public class UserNotFoundException extends RuntimeException {
public UserNotFoundException(String message) {
super(message);
}
}
এখানে, UserNotFoundException একটি কাস্টম এক্সসেপশন ক্লাস যা RuntimeException থেকে এক্সটেন্ড করেছে। এটি একটি কাস্টম ত্রুটি তৈরি করে, যেটি ব্যবহারকারীর তথ্য না পাওয়ার ক্ষেত্রে ব্যবহার করা হবে।
2. @ExceptionHandler ব্যবহার করে কাস্টম এক্সসেপশন হ্যান্ডলিং:
Spring MVC তে @ExceptionHandler অ্যানোটেশন ব্যবহার করে এক্সসেপশন হ্যান্ডল করা যায়। এটি কন্ট্রোলারে একটি মেথড চিহ্নিত করে যা নির্দিষ্ট এক্সসেপশন হ্যান্ডল করবে।
কন্ট্রোলারে @ExceptionHandler এর উদাহরণ:
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
@ControllerAdvice // Global exception handler
public class GlobalExceptionHandler {
@ExceptionHandler(UserNotFoundException.class) // Handle specific exception
public String handleUserNotFoundException(UserNotFoundException ex, Model model) {
model.addAttribute("errorMessage", ex.getMessage());
return "errorPage"; // Error page to show to the user
}
}
এখানে:
@ExceptionHandler(UserNotFoundException.class): এটিUserNotFoundExceptionএক্সসেপশনকে হ্যান্ডল করার জন্য নির্দিষ্ট করা হয়েছে। যখনUserNotFoundExceptionথ্রো হবে, এই মেথডটি কল হবে।handleUserNotFoundException: এই মেথডটি এক্সসেপশন গ্রহণ করবে এবং ব্যবহারকারীকে একটি কাস্টম errorPage দেখাবে।
Note: @ControllerAdvice ব্যবহার করলে এই এক্সসেপশন হ্যান্ডলারটি অ্যাপ্লিকেশনের সব কন্ট্রোলারে গ্লোবালি প্রযোজ্য হবে। এটি এপ্লিকেশন-লেভেল এক্সসেপশন হ্যান্ডলিং সরবরাহ করে।
3. কন্ট্রোলারে কাস্টম এক্সসেপশন ট্রিগার করা:
কন্ট্রোলারে কাস্টম এক্সসেপশন throw করার মাধ্যমে আপনি নির্দিষ্ট ত্রুটি পরিস্থিতি তৈরি করতে পারেন।
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class UserController {
@GetMapping("/user/{id}")
public String getUserById(@PathVariable("id") int id) {
// যদি ইউজার না পাওয়া যায়, তবে কাস্টম এক্সসেপশন ট্রিগার করুন
if (id <= 0) {
throw new UserNotFoundException("User not found with ID: " + id);
}
return "userDetails"; // Normal processing
}
}
এখানে:
throw new UserNotFoundException(...): যখন ইউজার ID শূন্য বা নেতিবাচক থাকে, তখন কাস্টম এক্সসেপশনটি থ্রো করা হয়।
4. গ্লোবাল এক্সসেপশন হ্যান্ডলার ব্যবহার করা:
@ControllerAdvice গ্লোবাল এক্সসেপশন হ্যান্ডলার হিসেবে কাজ করে। এটি সমস্ত কন্ট্রোলারের জন্য সাধারণ এক্সসেপশন হ্যান্ডলিং প্রদান করে। এটি অ্যাপ্লিকেশনের সকল কন্ট্রোলারের এক্সসেপশন হ্যান্ডলিং কেন্দ্রীয়ভাবে ম্যানেজ করতে সাহায্য করে।
GlobalExceptionHandler উদাহরণ:
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class) // Handle general exceptions
public String handleAllExceptions(Exception ex, Model model) {
model.addAttribute("errorMessage", "An error occurred: " + ex.getMessage());
return "errorPage"; // A general error page
}
@ExceptionHandler(UserNotFoundException.class) // Handle specific exception
public String handleUserNotFoundException(UserNotFoundException ex, Model model) {
model.addAttribute("errorMessage", ex.getMessage());
return "userNotFoundPage"; // Custom error page for User Not Found
}
}
এখানে:
@ControllerAdvice: এটি গ্লোবাল এক্সসেপশন হ্যান্ডলার হিসাবে কাজ করছে।@ExceptionHandler(Exception.class): এটি সাধারণ সকল এক্সসেপশন হ্যান্ডল করবে।@ExceptionHandler(UserNotFoundException.class): এটিUserNotFoundExceptionএর জন্য কাস্টম হ্যান্ডলার তৈরি করবে।
5. কাস্টম এক্সসেপশন এবং হ্যান্ডলিং ভিউ:
কাস্টম এক্সসেপশন হ্যান্ডলিংয়ের জন্য সাধারণত একটি কাস্টম এরর পেজ তৈরি করা হয়, যা ব্যবহারকারীকে এক্সসেপশন সম্পর্কিত পরিষ্কার বার্তা দেখাবে।
Error Page (errorPage.jsp):
<!DOCTYPE html>
<html>
<head>
<title>Error</title>
</head>
<body>
<h1>An error occurred</h1>
<p>${errorMessage}</p>
</body>
</html>
User Not Found Error Page (userNotFoundPage.jsp):
<!DOCTYPE html>
<html>
<head>
<title>User Not Found</title>
</head>
<body>
<h1>User Not Found</h1>
<p>${errorMessage}</p>
</body>
</html>
উপসংহার:
Spring MVC তে @ExceptionHandler ব্যবহার করে কাস্টম এক্সসেপশন হ্যান্ডল করা খুবই সুবিধাজনক। এটি আপনাকে আপনার অ্যাপ্লিকেশনের বিভিন্ন অংশে বিশেষ ত্রুটি ব্যবস্থাপনা এবং ভিউ রেন্ডারিং সহজভাবে কনফিগার করতে সহায়তা করে। এর মাধ্যমে আপনি গ্লোবাল এবং কাস্টম এক্সসেপশন হ্যান্ডলার তৈরি করতে পারেন, যা ত্রুটির ধরন অনুযায়ী ব্যবহারকারীদের সঠিক বার্তা দেখাতে সাহায্য করবে।
@ControllerAdvice হল Spring Framework-এ একটি বিশেষ অ্যানোটেশন যা গ্লোবাল এক্সেপশন হ্যান্ডলিংয়ের জন্য ব্যবহৃত হয়। এটি Spring MVC অ্যাপ্লিকেশন-এ যেকোনো @Controller থেকে ফেলা হওয়া এক্সেপশনগুলি কেন্দ্রীভূতভাবে হ্যান্ডল করতে সাহায্য করে। @ControllerAdvice একটি কন্ট্রোলারকে গ্লোবাল স্কোপে এক্সেপশন হ্যান্ডলিংয়ের জন্য অ্যাপ্লিকেশন জুড়ে কার্যকর করে তোলে।
এটি এক্সেপশন হ্যান্ডলিংয়ের জন্য খুবই সুবিধাজনক, কারণ আপনি আলাদা আলাদা কন্ট্রোলারগুলিতে এক্সেপশন হ্যান্ডলিং কাস্টমাইজ করার বদলে একটি কেন্দ্রীয়ভাবে একটি গ্লোবাল কন্ট্রোলার তৈরি করতে পারেন।
@ControllerAdvice এর প্রধান ফিচার
- Global Exception Handling: এটি সমস্ত @Controller-এ এক্সেপশন হ্যান্ডলিংয়ের জন্য গ্লোবালভাবে কাজ করে।
- Exception Binding: এক্সেপশন হ্যান্ডলার মেথডে নির্দিষ্ট এক্সেপশন কেসের জন্য ডাটা পাস করতে পারেন।
- Model Manipulation: আপনি এক্সেপশন হ্যান্ডলার মেথডে মডেল অ্যাট্রিবিউটের মাধ্যমে ভিউতে ডেটা পাঠাতে পারেন।
- Multiple Exception Handling: একাধিক এক্সেপশন টাইপের জন্য একাধিক মেথড ব্যবহার করা যায়।
@ControllerAdvice এর মাধ্যমে Global Exception Handling কিভাবে কাজ করে
1. @ControllerAdvice এর সাথে এক্সেপশন হ্যান্ডলিং কনফিগারেশন
@ControllerAdvice একটি ক্লাসে ব্যবহার করা হয় যা @ExceptionHandler, @ModelAttribute, এবং @InitBinder অ্যানোটেশনগুলি প্রয়োগ করতে পারে।
2. ControllerAdvice Class তৈরি করা
@ControllerAdvice ব্যবহার করে একটি গ্লোবাল এক্সেপশন হ্যান্ডলিং কন্ট্রোলার তৈরি করতে হবে।
GlobalExceptionHandler.java:
import org.springframework.http.HttpStatus;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
@ControllerAdvice
public class GlobalExceptionHandler {
// Handling general Exception
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public String handleGeneralException(Exception ex, Model model) {
model.addAttribute("errorMessage", ex.getMessage());
return "error"; // This will map to /WEB-INF/jsp/error.jsp or Thymeleaf view
}
// Handling specific exception, e.g., NullPointerException
@ExceptionHandler(NullPointerException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public String handleNullPointerException(NullPointerException ex, Model model) {
model.addAttribute("errorMessage", "Null Pointer Exception occurred: " + ex.getMessage());
return "error"; // Return the view to show the error
}
}
এখানে, @ControllerAdvice কন্ট্রোলারটি পুরো অ্যাপ্লিকেশন জুড়ে এক্সেপশন হ্যান্ডলিং করবে। আপনি @ExceptionHandler অ্যানোটেশন দিয়ে একাধিক এক্সেপশন টাইপ কভার করতে পারেন। উপরের কোডে, NullPointerException এবং Exception দুটি আলাদা ধরনের এক্সেপশন হ্যান্ডল করা হয়েছে।
3. View Page (Error Handling)
error.jsp (JSP):
<!DOCTYPE html>
<html>
<head>
<title>Error</title>
</head>
<body>
<h2>Error Occurred: ${errorMessage}</h2>
</body>
</html>
error.html (Thymeleaf):
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Error</title>
</head>
<body>
<h2 th:text="'Error Occurred: ' + ${errorMessage}"></h2>
</body>
</html>
4. Controller Example with Exception
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class MyController {
@GetMapping("/causeError")
public String causeError() {
// Simulating an exception
throw new NullPointerException("This is a simulated exception!");
}
}
এটি /causeError URL এ গিয়ে একটি NullPointerException সৃষ্টি করবে, যা গ্লোবাল এক্সেপশন হ্যান্ডলার দ্বারা হ্যান্ডল করা হবে।
@ControllerAdvice-এ অন্যান্য কার্যক্রম
- @ModelAttribute: আপনি
@ControllerAdvice-এর মাধ্যমে মডেল অ্যাট্রিবিউট গ্লোবালি সেট করতে পারেন, যা সমস্ত কন্ট্রোলারের জন্য প্রযোজ্য।
@ControllerAdvice
public class GlobalModelAttributes {
@ModelAttribute("appName")
public String populateAppName() {
return "My Spring Application";
}
}
এখানে, আপনি সমস্ত কন্ট্রোলারের ভিউতে একটি অ্যাট্রিবিউট appName ব্যবহার করতে পারবেন।
- @InitBinder: এটি কন্ট্রোলারের জন্য ডাটা বাইন্ডিং কাস্টমাইজ করতে ব্যবহৃত হয়।
@ControllerAdvice
public class GlobalDataBinder {
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), false));
}
}
এটি সমস্ত কন্ট্রোলারের জন্য ডাটা বাইন্ডিং কাস্টমাইজ করবে।
Spring Boot এ Global Exception Handling
Spring Boot অ্যাপ্লিকেশনে @ControllerAdvice ব্যবহার করে গ্লোবাল এক্সেপশন হ্যান্ডলিং খুবই সহজ এবং স্বয়ংক্রিয়ভাবে কাজ করে।
application.properties:
# Enable detailed error messages (optional)
server.error.whitelabel.enabled=false
এখানে Spring Boot এর WhitelabelErrorPage বন্ধ করে আপনি নিজের কাস্টম এক্সেপশন পেজ তৈরি করতে পারেন, যা @ControllerAdvice দ্বারা পরিচালিত হবে।
উপসংহার
@ControllerAdvice Spring MVC এবং Spring Boot অ্যাপ্লিকেশনে গ্লোবাল এক্সেপশন হ্যান্ডলিংয়ের জন্য একটি শক্তিশালী টুল। এটি @ExceptionHandler, @ModelAttribute, এবং @InitBinder অ্যানোটেশনগুলির মাধ্যমে অ্যাপ্লিকেশনের সমস্ত কন্ট্রোলার থেকে আসা এক্সেপশনগুলি একত্রে হ্যান্ডল করতে সহায়তা করে। এটি কোডের পুনরাবৃত্তি কমাতে, উন্নত ত্রুটি রিপোর্টিং এবং ইউজার-ফ্রেন্ডলি এক্সেপশন পেজ প্রদান করতে সহায়ক।
এটি একটি বড় প্রজেক্টের ক্ষেত্রে অত্যন্ত সহায়ক হতে পারে, কারণ এটি কেন্দ্রীয়ভাবে এক্সেপশনগুলি পরিচালনা এবং অ্যাপ্লিকেশনের ভিউগুলোকে নিয়ন্ত্রণ করে।
Spring MVC তে Exception Handling হল একটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা HTTP রিকোয়েস্ট প্রক্রিয়াকরণের সময় ঘটে এমন ত্রুটিগুলিকে সঠিকভাবে হ্যান্ডল করার সুযোগ প্রদান করে। Spring MVC তে ত্রুটির জন্য বিভিন্ন ধরনের কৌশল ব্যবহার করা যেতে পারে, যেমন:
- @ExceptionHandler অ্যানোটেশন: কন্ট্রোলারের মধ্যে স্পেসিফিক এক্সসেপশন হ্যান্ডলিং।
- @ControllerAdvice: গ্লোবাল এক্সসেপশন হ্যান্ডলিং।
- Custom Error Pages: কাস্টম ত্রুটি পৃষ্ঠার মাধ্যমে ত্রুটির প্রতিবেদন।
1. @ExceptionHandler এর মাধ্যমে Exception Handling
Spring MVC তে @ExceptionHandler অ্যানোটেশন ব্যবহার করে কন্ট্রোলারের মধ্যে নির্দিষ্ট এক্সসেপশন হ্যান্ডল করা যেতে পারে।
Step 1: Controller তৈরি
এখানে আমরা একটি কন্ট্রোলার তৈরি করব যা কিছু কার্যকলাপ প্রক্রিয়া করবে, এবং একটি কাস্টম এক্সসেপশন ছুড়ে দিবে।
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ExceptionHandler;
@Controller
public class HomeController {
@GetMapping("/home")
public String homePage(@RequestParam(value = "name", defaultValue = "") String name) {
if (name.isEmpty()) {
throw new IllegalArgumentException("Name parameter is required!"); // যদি name না থাকে, ত্রুটি ছোড়া হবে
}
return "home"; // সফল হলে home.jsp ভিউ রিটার্ন করবে
}
@ExceptionHandler(IllegalArgumentException.class) // এই এক্সসেপশনটি কন্ট্রোলার মেথডের মধ্যে হ্যান্ডল হবে
public String handleIllegalArgumentException(IllegalArgumentException ex) {
// ত্রুটি হলে কাস্টম ত্রুটি পৃষ্ঠায় রিডাইরেক্ট করা হবে
return "error"; // error.jsp পৃষ্ঠায় রিডাইরেক্ট হবে
}
}
ব্যাখ্যা:
homePage()মেথডেnameপ্যারামিটার যদি ফাঁকা থাকে, তাহলে একটিIllegalArgumentExceptionছোড়া হবে।@ExceptionHandler(IllegalArgumentException.class)এই অ্যানোটেশনটি কন্ট্রোলারের মধ্যে সেই ত্রুটির জন্য একটি হ্যান্ডলার মেথড চিহ্নিত করে।
Step 2: View তৈরি
এখানে একটি কাস্টম ত্রুটি পৃষ্ঠার (error.jsp) উদাহরণ দেওয়া হল, যা এক্সসেপশন ঘটলে ব্যবহারকারীর কাছে প্রদর্শিত হবে।
error.jsp:
<!DOCTYPE html>
<html>
<head>
<title>Error Page</title>
</head>
<body>
<h1>An error occurred: ${exception.message}</h1>
</body>
</html>
এটি কাস্টম error.jsp পৃষ্ঠা যা IllegalArgumentException এর ত্রুটি মেসেজ দেখাবে।
2. @ControllerAdvice এর মাধ্যমে Global Exception Handling
@ControllerAdvice ব্যবহার করে আপনি গ্লোবালভাবে সমস্ত কন্ট্রোলারের জন্য এক্সসেপশন হ্যান্ডলিং করতে পারেন। এটি Spring MVC অ্যাপ্লিকেশনে একাধিক কন্ট্রোলার এবং মেথডের জন্য এক্সসেপশন হ্যান্ডলিং সহজ করে তোলে।
Step 1: @ControllerAdvice কনফিগারেশন
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(IllegalArgumentException.class)
public String handleIllegalArgumentException(IllegalArgumentException ex) {
// সমস্ত কন্ট্রোলারের জন্য এক্সসেপশন হ্যান্ডলিং
return "error"; // error.jsp পৃষ্ঠায় রিডাইরেক্ট করা হবে
}
// আপনি আরও এক্সসেপশন হ্যান্ডলিং মেথড এখানে যোগ করতে পারেন
}
ব্যাখ্যা:
@ControllerAdvice: এই অ্যানোটেশনটি সমস্ত কন্ট্রোলারের জন্য গ্লোবাল এক্সসেপশন হ্যান্ডলিং সক্রিয় করে।@ExceptionHandler: এক্সসেপশন টাইপের ভিত্তিতে আপনি একাধিক এক্সসেপশন হ্যান্ডল করতে পারেন।
Step 2: View তৈরি
error.jsp ফাইলটি আগেই তৈরি করা হয়েছে, তাই এখানেও ব্যবহার করা হবে।
3. Custom Error Pages
Spring MVC তে আপনি কাস্টম Error Pages তৈরি করতে পারেন যা HTTP স্ট্যাটাস কোড অনুযায়ী প্রদর্শিত হবে, যেমন 404 (Page Not Found), 500 (Internal Server Error) ইত্যাদি।
Step 1: Custom Error Page কনফিগারেশন
Spring MVC তে web.xml বা Java Config এর মাধ্যমে কাস্টম ত্রুটি পৃষ্ঠা কনফিগার করা যায়।
Java-based configuration (WebConfig.java):
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
// View Resolver কনফিগারেশন
registry.jsp().prefix("/WEB-INF/views/").suffix(".jsp");
}
// Custom Error Page কনফিগারেশন
@Override
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
exceptionResolvers.add(new DefaultHandlerExceptionResolver());
}
}
Step 2: Custom Error Pages (error404.jsp, error500.jsp)
এখানে কিছু কাস্টম ত্রুটি পৃষ্ঠার উদাহরণ:
error404.jsp:
<!DOCTYPE html>
<html>
<head>
<title>Page Not Found</title>
</head>
<body>
<h1>Error 404: Page Not Found</h1>
<p>The page you are looking for might have been moved or deleted.</p>
</body>
</html>
error500.jsp:
<!DOCTYPE html>
<html>
<head>
<title>Internal Server Error</title>
</head>
<body>
<h1>Error 500: Internal Server Error</h1>
<p>There was an error processing your request. Please try again later.</p>
</body>
</html>
Conclusion:
Spring MVC তে Exception Handling খুবই গুরুত্বপূর্ণ। এটি ডেভেলপারদের প্রক্রিয়াকরণের সময় ত্রুটি ম্যানেজমেন্ট সহজ এবং কার্যকরীভাবে করার সুযোগ দেয়। Spring MVC-তে তিনটি প্রধান কৌশল রয়েছে:
- @ExceptionHandler - নির্দিষ্ট কন্ট্রোলারের জন্য এক্সসেপশন হ্যান্ডলিং।
- @ControllerAdvice - গ্লোবাল এক্সসেপশন হ্যান্ডলিং।
- Custom Error Pages - কাস্টম ত্রুটি পৃষ্ঠাগুলির মাধ্যমে HTTP ত্রুটির জন্য উপযুক্ত পেজ দেখানো।
এই কৌশলগুলোর মাধ্যমে আপনি Spring MVC অ্যাপ্লিকেশনে ত্রুটি পরিচালনা করার ক্ষমতা অর্জন করতে পারেন এবং ব্যবহারকারীর জন্য একটি সুন্দর, কার্যকরী ত্রুটি সিস্টেম তৈরি করতে পারেন।
Read more